import java.util.Scanner;

public class day_03_Exception_4 {
    public static void main(String[] args) {
        /*
         * 需求：
         *      键盘录入自己心仪的女朋友姓名和年龄。
         *      姓名的长度在3－10之间，
         *      年龄的范围为18-40岁，
         *      超出这个范围是异常数据不能赋值，需要重新录入，一直录到正确为止，
         * 提示：
         *      需要考虑用户在键盘录入时的所有情况。
         *      比如：录入年龄时超出范围，录入年龄时录入了abc等情况
         */
        class NameFormatException extends RuntimeException {
            public NameFormatException(String message) {
                super(message);
            }
        }
        
        class AgeOutOfBoundsException extends RuntimeException {
            public AgeOutOfBoundsException(String message) {
                super(message);
            }
        }
        class GirlFriend {
            private String name;
            private int age;

            public void setName(String name) {
                if (name.length() < 3 || name.length() > 10) {
                    throw new NameFormatException(name + "的长度为:" + name.length() + ", 超出了姓名的长度范围(3 ~ 10)");
                }
                this.name = name;
            }

            public void setAge(int age) {
                if (age < 18 || age > 40) {
                    throw new AgeOutOfBoundsException(age + "不符合年龄的范围(18 ~ 40)");
                }
                this.age = age;
            }

            public GirlFriend() {
            }

            @Override
            public String toString() {
                return "GirlFriend [name=" + name + ", age=" + age + "]";
            }

        }

        Scanner sc = new Scanner(System.in);
        GirlFriend girlFriend = new GirlFriend();

        while (true) {
            try {
                System.out.print("请输入姓名：");
                girlFriend.setName(sc.nextLine());

                System.out.print("请输入年龄：");
                girlFriend.setAge(Integer.parseInt(sc.nextLine()));

                break;
            } catch (NumberFormatException e) {
                e.printStackTrace();
                continue;
            } catch (NameFormatException e) {
                e.printStackTrace();
                continue;
            } catch (AgeOutOfBoundsException e) {
                e.printStackTrace();
                continue;
            }
        }
        sc.close();

        System.out.println(girlFriend);
    }
}
